#include <iostream>
#include "DoubleLinkList.hpp"
#include "LinkQueue.hpp"
#include "DynamicArray.hpp"
#include "LinkStack.hpp"
#include "MaxHeap.hpp"
#include "MinHeap.hpp"
#include "LinkTree.hpp"

int main()
{
    // DoubleLinkList<int> list;
    // for(int i = 0; i < 10; i++)
    // {
    //     list.InsertTail(i + 1);
    // }
    // for(int i = 0; i < 10; i++)
    // {
    //     list.InsertHead(i + 1);
    // }
    // std::cout<<list;
    // list.RemoveByIndex(0);
    // list.InsertByIndex(4,100);
    // std::cout<<list;
    // return 0;

    // LinkQueue<int> q;
    // for (int i = 0; i < 10; i++)
    // {
    //     q.Push(i + 1);
    // }
    // while(q.IsEmpty() == false)
    // {
    //     std::cout<<q.GetFront()<<" ";
    //     q.Pop();
    // }
    // std::cout<<std::endl;
    // return 0;

    // DynamicArray<int> l;
    // for(int i = 0; i < 10; i++)
    // {
    //     l.InsertTail(i + 1);
    // }
    // l.show();
    // l.RemoveByElement(6);
    // l.show();
    // DynamicArray<int> result = l.FindByElement(3);
    // result.show();
    // l.UpdateByIndex(0,100);
    // l.show();
    // l.UpdateByElement(3,999);
    // l.show();

    // LinkStack<int> l;
    // for(int i = 0; i < 10; i++)
    // {
    //     l.Push(i+1);
    // }
    // while(l.IsEmpty() == false)
    // {
    //     std::cout<<l.GetTop()<<" ";
    //     l.Pop();
    // }
    // std::cout<<std::endl;

    // MaxHeap<int> h;
    // for(int i = 0; i < 10; i++)
    // {
    //     h.Insert(i + 1);
    // }
    // h.show();
    // h.RemoveRoot();
    // h.show();
    // return 0;

    // MinHeap<int> h;
    // for(int i = 0; i < 10; i++)
    // {
    //     h.Insert(i + 1);
    // }
    // h.show();
    // h.RemoveRoot();
    // h.show();
    // srand(time(nullptr)); //随机获取二十个数
    // int a[20];
    // for(int i = 0; i < 20; i++)
    // {
    //     a[i] = rand() % 100 + 1;
    // }
    // for(int i = 0; i < 20; i++)
    // {
    //     std::cout<<a[i]<<" ";
    // }
    // std::cout<<std::endl;
    // MinHeap<int> h;
    // for(int i = 0; i < 20; i++)
    // {
    //     if(i < 5) //先取出五个数
    //     {
    //         h.Insert(a[i]);
    //     }
    //     else
    //     {
    //         if(a[i] > h.GetRoot()) //如果新插入的那个数比第一个数大
    //         {
    //             h.RemoveRoot(); //删除根节点(第一个数)
    //             h.Insert(a[i]); //把大的那个数插入进去
    //         }
    //     }
    // }
    // h.show();

    // LinkTree<int> tree;
    // TreeNode<int> *n1 = new TreeNode(1);
    // TreeNode<int> *n2 = new TreeNode(2);
    // n1->Connect(tree.GetRoot());
    // n2->Connect(tree.GetRoot());
    // TreeNode<int> *n3 = new TreeNode(3);
    // TreeNode<int> *n4 = new TreeNode(4);
    // TreeNode<int> *n5 = new TreeNode(5);
    // n3->Connect(n1);
    // n4->Connect(n2);
    // n5->Connect(n4);
    // tree.show();

    LinkTree<std::string> tree;
    TreeNode<std::string> *class1 = new TreeNode<std::string>("267班");
    TreeNode<std::string> *class2 = new TreeNode<std::string>("268班");
    class1->Connect(tree.GetRoot());
    class2->Connect(tree.GetRoot());
    TreeNode<std::string> *stu1 = new TreeNode<std::string>("张三");
    TreeNode<std::string> *stu2 = new TreeNode<std::string>("李四");
    TreeNode<std::string> *stu3 = new TreeNode<std::string>("王五");
    TreeNode<std::string> *stu4 = new TreeNode<std::string>("赵六");
    stu1->Connect(class1);
    stu2->Connect(class1);
    stu3->Connect(class2);
    stu4->Connect(class2);
    tree.show();
    std::cout << "树高：" << tree.GetTreeHigh() << std::endl;

    return 0;
}